#数据分析 读取 处理 存储
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie ,Bar,Timeline
import matplotlib.pyplot as plt

#用pandas.read_csv()读取指定的excel文件
df=pd.read_csv('weather.csv',encoding='gb18030')
print(df['日期'])

#datatime Series DataFrame 日期格式的数据类型
df['日期']=df['日期'].apply(lambda x:pd.to_datetime(x))
print(df['日期'])

#新建一列月份数据（将日期中的月份month一项单独取出）
df['month']=df['日期'].dt.month
df['year']=df['日期'].dt.year
df['yearm']=df['日期'].dt.strftime('%Y-%m')
print(df['yearm'])
#需要的数据 每个月中每种天气出现的次数

# 提取日期和气温数据
dates = df['日期'].tolist()
high_temperatures = df['最高气温'].tolist()
low_temperatures = df['最低气温'].tolist()

# 按月份分组并计算平均气温
monthly_temperatures = {}
for date, high, low in zip(dates, high_temperatures, low_temperatures):
    month = date.month
    if month not in monthly_temperatures:
        monthly_temperatures[month] = {'最高气温': [], '最低气温': []}
    monthly_temperatures[month]['最高气温'].append(high)
    monthly_temperatures[month]['最低气温'].append(low)

max_tem=[]
# 计算平均气温并输出结果
for month, data in monthly_temperatures.items():
    high_avg = sum(data['最高气温']) / len(data['最高气温'])
    low_avg = sum(data['最低气温']) / len(data['最低气温'])
    print(f'{month}月的平均最高气温为：{high_avg:.2f}°C')
    print(f'{month}月的平均最低气温为：{low_avg:.2f}°C')
    max_tem.append(high_avg)
max_tem.sort(reverse=True)
print("排序后的最高气温列表：")

for month, data in monthly_temperatures.items():
    if sum(data['最高气温']) / len(data['最高气温'])==max_tem[0]:
        print(f'{month}月 {max_tem[0]:.2f}°C')







#返回的是DataFrame GroupBy聚合对象 size（）能计算分组的大小
df_agg=df.groupby(['yearm','month','天气']).size().reset_index()
print(df_agg)






#设置列名
df_agg.columns=['yearm','month','tianqi','count']

#天气数据的形成
print(df_agg[df_agg['yearm']=='2021-01'][['tianqi','count']]\
      .sort_values(by='count',ascending=False).values.tolist())


#画图
#实例化一个时间序列对象
timeline=Timeline()
#播放参数
timeline.add_schema(play_interval=1000)

#遍历df_agg['month']里的唯一值
for year in df_agg['yearm'].unique():

    data=(
        df_agg[df_agg['yearm']==year][['tianqi','count']]
        .sort_values(by='count',ascending=True)
        .values.tolist()
    )

#绘制柱状图
    bar=Bar()
    #x轴是天气名称
    bar.add_xaxis([x[0] for x in data])
    #y轴是出现次数
    bar.add_yaxis('',[x[1]for x in data])
    #让柱状图横放
    bar.reversal_axis()
    #将计数标签放在图形右边
    bar.set_series_opts(label_opts=opts.LabelOpts(position='right'))
    #设置图表名称
    bar.set_global_opts(title_opts=opts.TitleOpts(title='长沙2020-2023年每月天气变化'))
    #将设置好的bar对象放入时间轮播图中
    timeline.add(bar,f'{year}月')




#将设置好的图表保存为’weathers.html‘文件
timeline.render('weathers.html')








